<?php
// +----------------------------------------------------------------------
// | ThinkPHP [ WE CAN DO IT JUST THINK ]
// +----------------------------------------------------------------------
// | Copyright (c) 2006-2016 http://thinkphp.cn All rights reserved.
// +----------------------------------------------------------------------
// | Licensed ( http://www.apache.org/licenses/LICENSE-2.0 )
// +----------------------------------------------------------------------
// | Author: 流年 <liu21st@gmail.com>
// +----------------------------------------------------------------------

// 应用公共文件
use app\common\Responses;

/**
 * Custom Function Library
 * @author zx
 * @date 2019-06-27
 */
if ( ! function_exists( 'welcome' ) ) {
    /**
     * 欢迎
     * @return string
     */
    function welcome():string
    {
        return '<style type="text/css">*{ padding: 0; margin: 0; } div{ padding: 4px 48px;} a{color:#2E5CD5;cursor: pointer;text-decoration: none} a:hover{text-decoration:underline; } body{ background: #fff; font-family: "Century Gothic","Microsoft yahei"; color: #333;font-size:18px;} h1{ font-size: 100px; font-weight: normal; margin-bottom: 12px; } p{ line-height: 1.6em; font-size: 42px }</style><div style="padding: 24px 48px;"> <h1>:) </h1><p> ThinkPHP V5.1<br/><span style="font-size:30px">12载初心不改（2006-2018） - 你值得信赖的PHP框架</span></p></div><script type="text/javascript" src="https://tajs.qq.com/stats?sId=64890268" charset="UTF-8"></script><script type="text/javascript" src="https://e.topthink.com/Public/static/client.js"></script><think id="eab4b9f840753f8e7"></think>';
    }
}

if ( ! function_exists( 'cacheStore' ) ) {
    /**
     * 获取缓存链接
     * @param string $cacheName 缓存方式名称
     * @return \think\cache\Driver|boolean
     */
    function cacheStore( string $cacheStore='default' )
    {
        if ( $cacheStore === 'default' ) {
            return \think\facade\Cache::store($cacheStore);
        }
        $cache = config('cache.');
        $inCache = [];
        foreach ( $cache as $_cache ) {
            if ( is_array($_cache) && isset($_cache['type']) && !in_array($_cache['type'], $inCache) ) {
                $inCache[] = $_cache['type'];
            }
        }
        if ( $inCache && in_array($cacheStore, $inCache) ) {
            return \think\facade\Cache::store($cacheStore);
        }
        return false;
    }
}

/**
 * Responses Function Library
 * User: zx
 * Date: 2019/7/4
 * Time: 15:41
 */
if ( ! function_exists('respond') ) {
    /**
     * 生成响应体
     *
     * @param mixed $data 请求参数
     * @param string $message 请求消息
     * @param int $code 状态码
     * @param array $headers 响应头
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json;
     */
    function respond($data=[], string $message='请求成功', int $code=Responses::HTTP_OK, array $headers=[])
    {
        return json([
            'code' => $code,
            'message' => $message,
            'data' => $data
        ], $code, $headers);
    }
}

if ( ! function_exists('message') ) {
    /**
     * 消息响应
     * @param string $message 消息
     * @param int $code 状态码
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function message( string $message, int $code=Responses::HTTP_OK )
    {
        return respond([], $message, $code);
    }
}

if ( ! function_exists( 'success' ) ) {
    /**
     * 请求响应成功
     * @param mixed $data 请求参数
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function success($data=[])
    {
        return respond($data);
    }
}

if ( ! function_exists( 'failed' ) ) {
    /**
     * 错误的请求响应
     * @param string $message 消息
     * @param int $code 状态码
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function failed(string $message, int $code=Responses::HTTP_BAD_REQUEST)
    {
        return message($message, $code);
    }
}

if ( !function_exists('notFound') ) {
    /**
     * 未找到响应资源
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function notFound( string $message='您访问的资源不存在' )
    {
        return message($message, Responses::HTTP_NOT_FOUND);
    }
}

if ( ! function_exists( 'internalError' ) ) {
    /**
     * 服务端未知错误响应
     * @param string $message 消息
     * @param int $code 状态码
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function internalError( string $message, int $code=Responses::HTTP_INTERNAL_SERVER_ERROR )
    {
        return message($message, $code);
    }
}

if ( ! function_exists( 'accepted' ) ) {
    /**
     * 消息已被放入任务队列响应
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function accepted( string $message='请求已被接收,请等待处理' )
    {
        return message($message, Responses::HTTP_ACCEPTED);
    }
}

if ( ! function_exists( 'stored' ) ) {
    /**
     * 创建资源成功后响应
     * @param array $data 参数
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function stored(array $data=[], string $message='创建成功')
    {
        return respond($data, $message);
    }
}

if ( ! function_exists( 'updated' ) ) {
    /**
     * 更新资源后响应成功
     * @param array $data 参数
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function updated( array $data=[], string $message='更新成功' )
    {
        return respond($data, $message);
    }
}

if ( ! function_exists( 'deleted' ) ) {
    /**
     * 删除资源后成功响应
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return think\response\Json
     */
    function deleted( string $message='删除成功' )
    {
        return message($message, Responses::HTTP_OK);
    }
}

if ( ! function_exists( 'power' ) ) {
    /**
     * 权限不足响应
     * @param string $message 消息
     * @author zx
     * @date 2019-07-04
     * @return \think\response\Json
     */
    function power( string $message='权限不足' )
    {
        return message($message, Responses::HTTP_UNAUTHORIZED);
    }
}

if ( ! function_exists( 'notLogin' ) ) {
    /**
     * 未登录响应
     * @param string $message 消息
     * @author zx
     * @date 2019-12-13
     * @return \think\response\Json
     */
    function notLogin( string $message='暂未登录' )
    {
        return respond(['url'=>'/admin/login'], $message, Responses::HTTP_FOUND);
    }
}

if ( ! function_exists('returnData') ) {
    /**
     * 生成响应体
     *
     * @param array $data 请求参数
     * @param string $message 请求消息
     * @param int $code 状态码
     * @param array $headers 响应头
     * @author zx
     * @date 2019-07-04
     * @return [];
     */
    function returnData(array $data=[], string $message='请求成功', int $code=Responses::HTTP_OK):array
    {
        return [
            'code' => $code,
            'message' => $message,
            'data' => $data
        ];
    }
}

/**
 * Array Operate Function Library
 * User: zx
 * Date: 2019/7/29
 * Time: 15:41
 */
if ( ! function_exists('get') ) {
    /**
     * 获取数组操作
     * @param array $array 数组
     * @param string $key KEY值
     * @param string|array $default 默认值
     * @author zx
     * @date 2019-07-29
     * @return mixed
     */
    function get( array $array, string $key, $default=NULL )
    {
        return $array[$key]??$default;
    }
}

if ( ! function_exists('multidimensional_search') ) {
    /**
     * 查找一维数组是否存在二维数组
     * @param array $parents 二维数组
     * @param array $searched 一维数组
     * @author zx
     * @date 2019-08-12
     * @return int|boolean
     */
    function multidimensional_search(array $parents, array $searched) {
        if (empty($searched) || empty($parents)) {
            return false;
        }
        foreach ($parents as $key => $value) {
            $exists = true;
            foreach ($searched as $skey => $svalue) {
                $exists = ($exists && isset($parents[$key][$skey]) && $parents[$key][$skey] == $svalue);
            }
            if($exists){
                return $key;
            }
        }
        return false;
    }
}

if ( ! function_exists('deep_in_array') ) {
    /**
     * 判断某个元素是否存在二维数组
     * @param string $value 元素
     * @param array $array 二维数组
     * @author zx
     * @date 2019-08-12
     * @return int|boolean
     */
    function deep_in_array(string $value, array $array) {
        foreach($array as $key => $item) {
            if(!is_array($item)) {
                if ($item != $value) {
                    continue;
                }
                return $key;
            }
            if(in_array($value, $item)) {
                return $key;
            } else if(deep_in_array($value, $item) !== false) {
                return $key;
            }
        }
        return false;
    }
}

/**
 * String Operate Function Library
 * User: zx
 * Date: 2019/9/3
 * Time: 18:13
 */
if ( ! function_exists('uncamelize') ) {
    /**
     * 大写字符串换为符号链接加小写字母
     * @param string $camelCaps 字符串
     * @param array $separator 连接字符串
     * @author zx
     * @date 2019-09-03
     * @return mixed
     */
    function uncamelize(string $camelCaps,string $separator='_')
    {
        return strtolower(preg_replace('/([a-z])([A-Z])/', "$1" . $separator . "$2", $camelCaps));
    }
}

if ( ! function_exists('is_json') ) {
    /**
     * 判断字符串是否为json
     * @param string $json json字符串
     * @author zx
     * @date 2020-01-09
     * @return bool
     */
    function is_json(string $json)
    {
        json_decode($json);
        return json_last_error() === JSON_ERROR_NONE;
    }
}
